package com.hjyang.solr.util;

import com.hjyang.solr.entity.QuerySolrAccident;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.Group;
import org.apache.solr.client.solrj.response.GroupCommand;
import org.apache.solr.client.solrj.response.GroupResponse;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.List;

@RestController
public class AccidentSolrQueryController {
    /**
     * Solr 服务器地址
     */
    @Value("${solr.url}")
    private String SOLR_URL;
    /**
     * Solr core
     */
    @Value("${solr.core}")
    private String SOLR_CORE;

    /**
     * 事故管理-事故列表
     *
     * @return
     */
    @GetMapping("/getAccidentList")
    public List<Object> getAccidentList(QuerySolrAccident querySolrAccident) {
        SolrQuery query = new SolrQuery();

        // 设置solr查询参数   query.set("q", "*:*");// 参数q  *:*：查询所有
        query.set("q", "accident_index_content:中国"); //

        // 过滤条件设置
        //query.addFilterQuery("sggk_qhdd:天津 OR sggk_qhdd:南京");// sggk_qhdd 字段值是天津或南京

//    q  查询的关键字，此参数最为重要，例如，q=id:1，默认为q=*:*，
//　　fl  指定返回哪些字段，用逗号或空格分隔，注意：字段区分大小写，例如，fl= id,title,sort
//　　fq  （filter query）过虑查询，提供一个可选的筛选器查询。返回在q查询符合结果中同时符合的fq条件的查询结果，例如：q=id:1&fq=sort:[1 TO 5]，找关键字id为1 的，并且sort是1到5之间的。

        query.setSort("sggk_qhsj", SolrQuery.ORDER.desc);// 排序方式：按照 sggk_qhsj 字段降序
        // 分页参数设置
        query.setStart(0);// 起始页
        query.setRows(3);// 页大小
        // 分组参数设置
        query.setParam("group", true);// 是否分组
        query.setParam("group.field", "accident_id");// 分组的字段 不可以是多值字段
        query.setParam("group.ngroups","true");// 是否返回 分组总数目


        queryGroupSolr(query);
        return null;
    }
    /**
     * 索引库分组查询文档
     *
     * @throws Exception
     */
    public boolean queryGroupSolr(SolrQuery query) {
        HttpSolrClient solrClient = SolrUtil.createSolrServer(SOLR_URL, SOLR_CORE);
        // 获取查询结果
        QueryResponse response = null;
        try {
            response = solrClient.query(query);
        } catch (SolrServerException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

        // 两种结果获取：得到文档集合或者实体对象
        // 查询得到文档的集合
        GroupResponse gresp = response.getGroupResponse();
        List<GroupCommand> commands = gresp.getValues();
        if(commands != null) {
            for(GroupCommand com : commands) {

                for (Group group : com.getValues()) {
                    SolrDocumentList hits = group.getResult();
                    for (SolrDocument doc : hits) {
                        System.out.println("id: " + (String) doc.getFieldValue("id") + ", title: " + doc.getFieldValue("sggk_qhdd") );
                        System.out.println("--------------------");
                    }
                }
            }
        }
        return true;
    }

    /**
     * 索引库查询文档
     *
     * @throws Exception
     */
    public boolean querySolr(SolrQuery query) {
        HttpSolrClient solrClient = SolrUtil.createSolrServer(SOLR_URL, SOLR_CORE);
        // 获取查询结果
        QueryResponse response = null;
        try {
            response = solrClient.query(query);
        } catch (SolrServerException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

        // 两种结果获取：得到文档集合或者实体对象
        // 查询得到文档的集合
        SolrDocumentList solrDocumentList = response.getResults();
        for (SolrDocument doc : solrDocumentList) {
            System.out.println("通过文档集合获取查询的结果--结果总数量：" + solrDocumentList.getNumFound());
            System.out.println("-- id:" + doc.get("id") + " -- filePath:" + doc.get("accident_index_content"));
        }
        
        return true;
    }
}
